// for fo 循环  遍历所有数据结构的统一方式
//  for 适用于遍历普通数组
//  for in适用于遍历键值对

// const arr = [100,200,300,400]

// for (const item of arr) {
//     console.log(item)
// }

// arr.forEach(item => {
//     console.log(item)
// })

// for (const item of arr) {
//     console.log(item)
//     if (item > 100) {
//         break // 随时跳出循环
//     }
// }

// arr.forEach //不能跳出循环
// 需要使用  arr.some() 或 arr.every()


// 遍历 Set 对象
// const a = new Set(['foo','bar'])
// for (const item of a) {
//     console.log(item)
// }

// 遍历 Map 对象
// const m = new Map
// m.set('foo','123')
// m.set('bar','345')

// for (const [key,value] of m) {
//     console.log(key,value)
// }


//遍历普通对象
// const obj = {foo:123,bar:456}
// for (const item of obj) {
//     console.log(item)
// }  //报错

// iterator 迭代器 
// 调用iterator方法得到一个迭代器，从而遍历内部所有的数据
// 只有实现了Iterator接口才可以进行for…of的遍历
// const set = new Set(['foo','bar','baz'])
// const iterator = set[Symbol.iterator]()
// console.log(iterator.next())
// console.log(iterator.next())
// console.log(iterator.next())
// console.log(iterator.next())



//------------------------------------------------
// 实现可迭代接口    Iterable

// const obj = {  //实现可迭代接口 Iterable
//     [Symbol.iterator]: function () {  // 用于返回迭代器的方法
//         return { //迭代器接口  iterator
//             next: function () {  //用于返回迭代器的next方法
//                 return { // 迭代结果接口  
//                     value: 'zce',
//                     done: true  // 表示迭代接口是否结束
//                 }
//             }
//         }
//     }
// }

// const obj = {  //实现可迭代接口 Iterable
//     store: ['foo','bar','baz'],

//     [Symbol.iterator]: function () {  // 用于返回迭代器的方法
//         let index = 0
//         const self = this
//         return { //迭代器接口  iterator
//             next: function () {  //用于返回迭代器的next方法
//                 const result = { // 迭代结果接口  
//                     value: self.store[index],
//                     done: index >= self.store.length  // 表示迭代接口是否结束
//                 }
//                 index++
//                 return result
//             }
//         }
//     }
// }

// for (const item of obj) {
//     console.log('循环体')
// }


// 迭代器设计模式 
// const todos = {
//     life: ['吃饭','睡觉','打豆豆'],
//     learn: ['语文','数学','外语'],
//     work: ['喝茶'],
//     each:function (ca) {
//         const all = [].concat(this.life,this.learn,this.work)
//         for (const item of all) {
//             ca(item)
//         }
//     },

//     [Symbol.iterator]: function () {
//         const all = [...this.life, ...this.learn, ...this.work]
//         let index = 0
//         return {
//             next: function () {
//                 return {
//                     value: all[index],
//                     done: index++ >= all.length
//                 }
//             }
//         }
//     }  // 对外提供统一遍历接口
// }

// todos.each(function (item) {
//     console.log(item)
// })

// console.log('----------------')
// for (const item of todos) {
//     console.log(item)
// }
